Tactical networking environments present significant challenges that must be overcome in order to effectively support net-centric warfare. The wireless and ad hoc nature of these networks implies unreliable connectivity, limited bandwidth, and variable latency. Past and current research has focused on physical and data link layers, routing protocols, transport protocols, and cross-layer aspects. However, significant work is needed at the upper layers to better support application requirements. In our experience, achieving effective communications in tactical environments requires taking into account application requirements and communication patterns, designing a rich interface between the application and communication layers, and realizing a communications middleware specifically adapted to tactical networks. In this article, we report on our observations from several tactical networking experiments and demonstrations and the lessons learned from deployment of the Mockets middleware to support tactical communications. We hope these experiences are useful to others designing and implementing applications and systems for tactical environments.